/* 
typeof: 
  在js中typeof用来获取一个表达式的类型名称, 可以通过打印来查看
  在ts中typeof用来用于获取一个变量或者属性的类型
    用来ts的类型检查
    不能通过打印查看, 如果用打印查看, 就是js的typeof
*/
(() => {
  
  const person = {
    name: 'tom',
    age: 12
  }
  function fn (x: number): string {
    return x + 'abc'
  }

  // js的typeof
  console.log(typeof person) // 'object'
  console.log(typeof fn) // 'function'
  console.log(typeof person.name) // 'string'

  // ts的typeof
  // 要求a的类型与person的一致
  let a: typeof person = {
    name: 'jack',
    age: 23
  }

  // 要求b的类型与fn的类型一致
  let b: typeof fn = (val: number): string => {
    return val.toString()
  }

  // 要求b的类型与person的name一致
  let c: typeof person.name = 'abc'
  // c = 123 // error

  // 也可以给一个变量或属性的类型定义一个别名
  type Person = typeof person
  let d: Person = {
    name: 'bob',
    age: 25,
  }

})()